﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
using System.Security.Cryptography;
namespace Lesson1_ArrayList
{
    class Text
    {

    }
    internal class Program
    {
        static void Main(string[] args)
        {
            #region 知识点一 ArrayList的本质
            // ArrayList是一个C#封装的数组，它比数组更灵活，可以动态改变数组的大小，可以存储不同类型的数据，可以存储null值，可以存储重复
            //它本质是一个object类型的数组
            //能帮助我们实现很多方法
            //比如数组的增添查找
            #endregion
            #region  知识点二 申明
            //引用命名空间using System.Collections;
            ArrayList array = new ArrayList();
            #region  增
            array.Add(1);
       
           
           
            
            array.Add(456);
            #endregion 
       
          
            //array.AddRange(array1);   //将另一个List 容器加到后面

            //Console.WriteLine(array1);
            //Console.WriteLine(array);
            #endregion

            #region 删
            //array.Remove(1);
            ////移除指定位置的元素
            //array.RemoveAt(2);
            //清空
            //array.Clear(); 
            #endregion

            #region 得到指定位置的元素
            Console.WriteLine(array[0]);

            #endregion

            #region  查
            if(array.Contains(278))
            {
                Console.WriteLine("存在2");
            }
            //正向查找元素位置
            //找到的返回值是位置 找不到 返回值 是-1
            int index = array.IndexOf(true);
            Console.WriteLine(index);


            Console.WriteLine(array.IndexOf(false));

            //反向查找元素位置

            index = array.LastIndexOf(true);
            Console.WriteLine(index);  //从头开始（0） 开始计数
            #endregion

            #region 改  和查指定位置有关
            array[0] = "精神氮泵";

            Console.WriteLine(array[0]);

            #endregion

            #region  查
            array.Insert(1, "厉害了老弟");
            Console.WriteLine(array[1]);
            #endregion

            #region 遍历
            //长度

            Console.WriteLine(array.Count);  //数组中元素的个数

            //容量  避免产生过多的垃圾
            Console.WriteLine(array.Capacity);  //数组中可以容纳的元素个数  
            #endregion
            Console.WriteLine("***************");
            for (int i = 0; i < array.Count; i++)
            {
                Console.WriteLine(array[i]);
            }
            Console.WriteLine("***************");
                //迭代器遍历
                foreach(object  m in array)
                {
                    Console.WriteLine(m);
                }
            //int i = 0;
            //array[0] = i;  //装箱 
            //i = (int)array[0];  //拆箱
        }
    }
}
//总结  
//学习了两种循环
//ArrayList 本质上是一个object类型的数组（什么都可以装）
//利用万物之父object存储数据，自然存在装箱拆箱
//当往其进行值类型存储时就是装箱，值对象取出来时就是拆箱
//所以ArrayList 存储值类型时，性能较低   
//尽量少用，之后会学习更好的数据容器
